package com.bitoon.web.utils;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import org.apache.log4j.Logger;

public class LocalizedText {

    private static LocalizedText instance = null;

    private Logger log = Logger.getLogger(LocalizedText.class);

    /*
    private Properties textosGuia = null;
    private static Properties tipoObjeto = null;
    private static Properties nombreObjeto = null;
     * 
     */

    //private static Map<String, Properties> mapaTextosGuia = null;
    private static Map<String, Properties> mapaTipoObjeto = null;
    private static Map<String, Properties> mapaNombreObjeto = null;
    private static Map<String, Properties> mapaDescripcionObjeto = null;
    private static Map<String, Properties> mapaNombreCaracteristicas = null;
    private static Map<String, Properties> mapaNombreTalento = null;
    private static Map<String, Properties> mapaDescripcionTalento = null;

    private static String idiomas[] = {"es", "en", "zh"};

    public static LocalizedText getInstance() {
        if (instance==null) {
            instance = new LocalizedText();
        }

        return instance;
    }

    // Constructor
    private LocalizedText() {
        log.debug("inicializar LocalizedText");

        // Se crean los diccionarios
        mapaTipoObjeto = new HashMap<String, Properties>();
        mapaNombreObjeto = new HashMap<String, Properties>();
        mapaDescripcionObjeto = new HashMap<String, Properties>();
        mapaNombreCaracteristicas = new HashMap<String, Properties>();
        mapaNombreTalento = new HashMap<String, Properties>();
        mapaDescripcionTalento = new HashMap<String, Properties>();

        log.debug("idiomas: " + idiomas);

        for(String i: idiomas) {
            log.debug("debuglocalizedtext - 1 bucle: " + i);
            mapaTipoObjeto.put(i, new Properties());
            mapaNombreObjeto.put(i, new Properties());
            mapaDescripcionObjeto.put(i, new Properties());
            mapaNombreCaracteristicas.put(i, new Properties());
            mapaNombreTalento.put(i, new Properties());
            mapaDescripcionTalento.put(i, new Properties());
        }

        // Se ponen los textos estáticos, en un futuro se sacarán a un fichero de texto
        // No me valen los del maestro porque están todos en mayúsculas

        Properties pes = mapaNombreCaracteristicas.get("zh");
        pes.put("1", "Tiro de 2");
        pes.put("2", "Tiro de 3");
        pes.put("3", "Tiro libre");
        pes.put("4", "Agresividad");
        pes.put("5", "Dribbling");
        pes.put("6", "Pase");
        pes.put("7", "Rebote Ofensivo");
        pes.put("8", "Rebote Defensivo");
        pes.put("9", "Robo");
        pes.put("10", "Tapón");
        pes.put("11", "Defensa");
        pes.put("12", "Resistencia");
        pes.put("13", "Velocidad");
        pes.put("14", "Sprint");
        pes.put("15", "Teamwork");
        pes.put("50", "Todas");
        pes.put("51", "Tiro");
        pes.put("52", "Ofensivas");
        pes.put("53", "Defensivas");
        pes.put("54", "Generales");
        pes.put("55", "Todas menos generales");
        pes.put("60", "Al azar");
        pes.put("61", "2 al azar");
        pes.put("62", "3 al azar");
        pes.put("63", "4 al azar");
        pes.put("70", "Más baja");
        pes.put("71", "2 más bajas");
        pes.put("72", "3 más bajas");
        pes.put("73", "4 más bajas");
        pes.put("80", "Más alta");
        pes.put("81", "Dos más altas");

        Properties pen = mapaNombreCaracteristicas.get("en");
        pen.put("1", "2-point shot");
        pen.put("2", "3-point shot");
        pen.put("3", "Free throw");
        pen.put("4", "Aggresiveness");
        pen.put("5", "Dribbling");
        pen.put("6", "Pass");
        pen.put("7", "Offensive reb.");
        pen.put("8", "Defensive reb.");
        pen.put("9", "Steal");
        pen.put("10", "Block");
        pen.put("11", "Defense");
        pen.put("12", "Stamina");
        pen.put("13", "Speed");
        pen.put("14", "Sprint");
        pen.put("15", "Teamwork");
        pen.put("50", "All");
        pen.put("51", "Throw");
        pen.put("52", "Offensive");
        pen.put("53", "Defensive");
        pen.put("54", "General");
        pen.put("55", "All except General");
        pen.put("60", "At random");
        pen.put("61", "2 at random");
        pen.put("62", "3 at random");
        pen.put("63", "4 at random");
        pen.put("70", "Lowest");
        pen.put("71", "2 lowest");
        pen.put("72", "3 lowest");
        pen.put("73", "4 lowest");
        pen.put("80", "Highest");
        pen.put("81", "2 highest");

        // Se cargan los diccionarios desde los ficheros <lang>db.txt
        log.debug("debuglocalizedtext: leyendo ficheros");
        for (String i: idiomas) {
            // Abrir fichero y leerlo
            log.debug("debuglocalizedtext abriendo " + i + "db.txt");
            String filename = "/resources/" + i.toUpperCase() + "DB.txt";
            InputStream is = getClass().getResourceAsStream(filename);
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String line;
            try {
                while ( (line=br.readLine()) != null) {
                    String[] spliteo = line.split("[|]");
                    if (spliteo[0].equals("1")) {
                        mapaTipoObjeto.get(i).put(spliteo[1], spliteo[2]);
                    } else if (spliteo[0].equals("11")) {
                        mapaNombreObjeto.get(i).put(spliteo[1], spliteo[2]);
                    } else if (spliteo[0].equals("12")) {
                        mapaDescripcionObjeto.get(i).put(spliteo[1], spliteo[2]);
                    } else if (spliteo[0].equals("32")) {
                        mapaNombreTalento.get(i).put(spliteo[1], spliteo[2]);
                    } else if (spliteo[0].equals("33")) {
                        mapaDescripcionTalento.get(i).put(spliteo[1], spliteo[2]);
                    }
                }
            } catch (Exception e) {
                log.error("debuglocalizedtext - Error leyendo textos <lang>db.txt", e);
            }
        }

        // Se cargan los diccionarios desde los ficheros maestro<lang>.txt
        for (String i: idiomas) {
            // Abrir fichero y leerlo
            String filename = "/resources/maestro_" + i.toUpperCase() + ".txt";
            InputStream is = getClass().getResourceAsStream(filename);
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String line;
            try {
                while ( (line=br.readLine()) != null) {
                    String[] spliteo = line.split("[|]");
                }
            } catch (Exception e) {
                log.error("debuglocalizedtext - Error leyendo ficheros maestros", e);
            }
        }

    }


    private void cargaTextos() {
        String filename = "";

        /*
        try {
            if (textosGuia == null) {
                textosGuia = new Properties();
                //String lang = (String)session.get("bd_lang");
                //String lang = ActionContext.getContext().getLocale().getLanguage();
                filename = "/resources/textosGuiaDelJuego_" + lang + ".xml";
                InputStream is = getClass().getResourceAsStream(filename);
                textosGuia.loadFromXML(is);
                log.debug("inicializado LocalizedText, textosGuia: ");
            }

            if (tipoObjeto == null) {
                tipoObjeto = new Properties();
                nombreObjeto = new Properties();
                // Abrir fichero y leerlo
                log.debug("traduccion 2");
                log.debug("en abriendo " + lang + "db.txt");
                filename = "/resources/" + lang + "db.txt";
                InputStream is = getClass().getResourceAsStream(filename);
                BufferedReader br = new BufferedReader(new InputStreamReader(is));
                String line;
                while ( (line=br.readLine()) != null) {
                    String[] spliteo = line.split("[|]");
                    if (spliteo[0].equals("1")) {
                        log.debug(line);
                        tipoObjeto.put(spliteo[1], spliteo[2]);
                    } else if (spliteo[0].equals("11")) {
                        log.debug(line);
                        nombreObjeto.put(spliteo[1], spliteo[2]);
                    }
                }
            } else {
                log.debug("traduccion 3");
            }

        } catch (Exception e) {
            log.error("Error al cargar los textos del fichero de objetos (filename=" + filename + ")", e);
        }
         * 
         */
    }


    public void reseteaLang() {
        log.debug("reseteaLang");

    }

    /*
    public String getTextoGuia(String key) {
        return textosGuia.getProperty(key);
    }

    public String getTextoGuia(String key, List<String> params, List<String> values) {
        int i=0;
        for (String p: params) {
            log.debug("param " + p + " = " + values.get(i++));
        }
        return textosGuia.getProperty(key);
    }
     *
     */

    public String getTipoObjeto(String lang, String key) {
        return mapaTipoObjeto.get(lang).getProperty(key);
    }

    public String getNombreObjeto(String lang, String key) {
        return mapaNombreObjeto.get(lang).getProperty(key);
    }
    
    public String getDescripcionObjeto(String lang, String key) {
        return mapaDescripcionObjeto.get(lang).getProperty(key);
    }

    public String getNombreCaracteristica(String lang, String key) {
        return mapaNombreCaracteristicas.get(lang).getProperty(key);
    }

    public String getNombreTalento(String lang, String key) {
        return mapaNombreTalento.get(lang).getProperty(key);
    }

    public String getDescripcionTalento(String lang, String key) {
        return mapaDescripcionTalento.get(lang).getProperty(key);
    }
    
}
